package red.stu.pconstraint;

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import red.stu.pconstraint.engine.WorkingSpace;
import red.stu.pconstraint.pojo.ExecutionLocation;
import red.stu.pconstraint.pojo.ProcessStorage;

import java.util.LinkedList;

/**
 * 流程储存
 * @author yihrmc @stu.red
 * @date 2019/11/14 14:01
 */
public interface ProcessStorageApi {

    /**
     * 创建流程数据
     * @param processStorage 需要保存的流程数据
     * @param workingSpace 参考的工作空间数据
     * @return 实例流程ID
     */
    @NotNull
    String createProcessData(@NotNull ProcessStorage processStorage, @NotNull WorkingSpace workingSpace);

    /**
     * 获取流程数据
     * @param processInstanceId 流程实例ID
     * @return
     */
    @Nullable
    ProcessStorage getProcessData(String processInstanceId);

    /**
     * 获取流程实例状态
     * @param processInstanceId 流程实例ID
     * @return
     */
    @Nullable
    Short getState(String processInstanceId);

    /**
     * 更新流程执行栈数据
     * @param processInstanceId 流程实例ID
     * @param callStack 执行栈
     */
    void updateProcessCallStack(String processInstanceId, LinkedList<ExecutionLocation> callStack);

    /**
     * 更新流程状态
     * @param processInstanceId 流程实例ID
     * @param state 状态
     */
    void updateState(String processInstanceId, Short state);

    /**
     * 更新流程状态和执行栈数据
     * @param processInstanceId
     * @param state
     * @param callStack
     */
    void updateStateAndCallStack(String processInstanceId, Short state, LinkedList<ExecutionLocation> callStack);

}
